package com.googlecode.lemyriapode.type;

/**
 * Abstract class
 * Fonctions récursives utiles remplaçant while ou for
 * @author Gilles
 * @param <S>
 * @param <A>
 * @param <E>
 */
public abstract class AChessCat<S, E> implements ChessCategory {
    
//    /**
//     * A est ici limité à une List
//     */
//    public AChessCat() {
//        s = (A) new ArrayList<Case>();
//    }

    public S s;

    /**
     * offset = 0
     * @param e
     * @return s
     */
    public final S f0(E e) {
        return f(0, e);
    }

    /**
     * Offset = 1
     * @param e
     * @return s
     */
    public final S f1(E e) {
        return f(1, e);
    }

    private final S f(int n, E e) {
        if (continuer(n, e)) {
            executer(n, e);
            return f(n + 1, e);
        } else {
            return stopper(n, e);
        }

    }

    /**
     *
     * @param n
     * @param e
     * @return vrai si la boucle peut poursuivre
     */
    public abstract boolean continuer(int n, E e);

    /**
     * execute une suite d'instructions
     * @param n
     * @param e
     */
    public abstract void executer(int n, E e);

    /**
     * methode d'arrêt, suite d'instruction après la fin de la boucle
     * @param n
     * @param e
     * @return s, la liste
     */
    public abstract S stopper(int n, E e);
}








